{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**问题：**\n",
    "假设你正在为一个电影推荐系统设计一个简单的KNN算法。我们有以下一些用户的电影评分数据，数据由两个特征组成：用户对电影A和电影B的评分，分别在1-5之间。用户的标签（电影类型偏好）是动作片（标签0）或者是喜剧片（标签1）。我们有一个新用户，他给电影A评分为3，电影B评分为4。请问这个用户可能偏好哪种类型的电影？\n",
    "\n",
    "**数据：**\n",
    "\n",
    "| 用户   | 电影A评分 | 电影B评分 | 偏好类型 |\n",
    "| ------ | --------- | --------- | -------- |\n",
    "| 用户1  | 5         | 1         | 动作片   |\n",
    "| 用户2  | 4         | 2         | 动作片   |\n",
    "| 用户3  | 2         | 5         | 喜剧片   |\n",
    "| 用户4  | 1         | 4         | 喜剧片   |\n",
    "| 用户5  | 3         | 2         | 动作片   |\n",
    "| 用户6  | 2         | 5         | 喜剧片   |\n",
    "\n",
    "你需要做以下步骤：\n",
    "1. 构造数据\n",
    "2. 创建KNN模型\n",
    "3. 使用数据训练模型\n",
    "4. 预测新用户的喜好"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 0. 引入核心包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.neighbors import KNeighborsClassifier"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. X, y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [],
   "source": [
    "X = np.array([\n",
    "    [5, 1],  # 用户1\n",
    "    [4, 2],  # 用户2\n",
    "    [2, 5],  # 用户3\n",
    "    [1, 4],  # 用户4\n",
    "    [3, 2],  # 用户5\n",
    "    [2, 5]   # 用户6\n",
    "])\n",
    "\n",
    "y = np.array([0, 0, 1, 1, 0, 1])  # 动作片为0，喜剧片为1"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. 创建 KNN 模型\n",
    "k = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [],
   "source": [
    "knn = KNeighborsClassifier()"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-9 {color: black;}#sk-container-id-9 pre{padding: 0;}#sk-container-id-9 div.sk-toggleable {background-color: white;}#sk-container-id-9 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-9 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-9 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-9 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-9 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-9 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-9 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-9 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-9 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-9 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-9 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-9 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-9 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-9 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-9 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-9 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-9 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-9 div.sk-item {position: relative;z-index: 1;}#sk-container-id-9 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-9 div.sk-item::before, #sk-container-id-9 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-9 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-9 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-9 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-9 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-9 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-9 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-9 div.sk-label-container {text-align: center;}#sk-container-id-9 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-9 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-9\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KNeighborsClassifier()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-9\" type=\"checkbox\" checked><label for=\"sk-estimator-id-9\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">KNeighborsClassifier</label><div class=\"sk-toggleable__content\"><pre>KNeighborsClassifier()</pre></div></div></div></div></div>"
      ],
      "text/plain": [
       "KNeighborsClassifier()"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn.fit(X, y)\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. 用模型推理(预测)用户的喜好"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "new_user = np.array([[3, 3]])\n",
    "prediction = knn.predict(new_user)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5. 数据可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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cXFx7D+cyo/LYzlxOhGfIq50bOtH5wfKUMTrrhrXbrc33niDefPmcfLkSbsHohcUaWlpxMfH4+vre9fnmJPPq9lsZtmyZXTt2rXQDPK8WWHPDwp/jsqv4HNUjln9fueWgv0rfRcymUw0b1SClk1s35m7oPjggw9o0qQJJUuWZMOGDcycOZNBgwbld1giIiIOoaJIbDp06BBvvPEGFy9epGLFiowcOZIXXnghv8MSERFxCBVFYtOsWbOYNWuW5X36qSUREZHC6O4eNCEiIiKSR1QUiYiIiKCiSERERARQUSQiIiICqCgSERERAVQUiYiIiAAqinLPxInwxhvZaztlyo3294jjx49jMpmIiorK71BERERsUlGUW5ydcZowAffbPctryhQYPx6cnXN19f3798dkMjF9+nSr6UuXLnXY89YcqX///oSGhuZ3GCIicg9RUZRbXn+dtEmT8Jw2zfYRo/SCaPJkeP31XA/Bw8ODGTNmcOnSpVzvW0REpLBTUZSbxo3j2quv4jRhwo0C6GYOLogAHnzwQfz9/TM8Ef5W69ev5/7778fT05OAgABefPFFrl69CsDcuXOpW7eupW36kaYPP/zQMq1jx46MGzfOZv//+9//CAkJwcPDg8aNG7Njxw6r+ampqQwcOJDKlSvj6elJUFAQc+bMscyfOHEiX3zxBd9//z0mkwmTycTq1asBePnll6lRowZeXl5UqVKF119/HbPZnO1tJCIiYouKolyWPHo0aZMm3SiA0gujPCiIAJydnZk2bRrvvfcep06dyrTNkSNH6Ny5M4899hi7du3im2++Yf369QwdOhSANm3asG/fPv766y8A1qxZQ6lSpSxFidlsZtOmTbRt2zbT/hMSEnjooYeoXbs227ZtY+LEiYwaNcqqTVpaGhUqVGDRokXs27eP8ePH8+qrr7Jw4UIARo0axeOPP07nzp2JiYkhJiaGli1bAuDj40N4eDj79u1jzpw5fPLJJ1aPIhEREckpPfvMEcaNA5PpRiH0xhuQkuLwgijdo48+SoMGDZgwYQKfffZZhvlhYWH06dOH4cOHA1C9enXeffdd2rRpw7x586hbty4lSpRgzZo1/Otf/2L16tW89NJLliM527Ztw2w2W4qUW0VERJCWlsZnn32Gh4cHderU4dSpUzz//POWNq6urkyaNMnyvnLlymzatImFCxfy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t++3SBHbfWTCbL5R0L322msMHjyY/v37U758ea5duwZgKQaPHTtG165dee2115g9ezbnz59nzJgxPPfcc7z//vs34r9yhZdffpnq1avz119/8dprr/HUU0+xaNEiAEufL7/8MlOmTCEwMJBixYoxceJEFi1axMyZM6latSobN26kb9++FClShFatWvHKK6+wZ88eFi5cSMmSJTl69CjXrl0jPj6elStX0r59e5YuXUrNmjVxc3OzxHyzhIQEAB5++GGWL1/O66+/zltvvQVAamqqpQgGGDZsGH/++SeffPIJZcuW5aeffqJr165s2LCBqlWrkpSUhGEYlvYLFy4kLCyMmTNn0qxZM7777jvmzp1LpUqVrIrp33//nZIlS/L9999z9OhRBg4cSFBQEP369QNuFKAzZ85kxIgRjBo1ilWrVjF8+HDKly9Pu3btSEtL45FHHqFIkSL89NNPXL9+ndGjR9OzZ09++ukn4EYxf/jwYRYuXMgXX3yBk5NThu2RkpLCtWvXLAWpPSIjI+1qX9AU9vyg8Oeo/Aq+3M4xMTExV/vLjMlI//M/j508eZLGjRsTGRlpGUvUtm1bGjRokO1BqmazmVq1atG7d2+mTJmSaZvk5GSSk5Mt7+Pj4wkICOD8+fP4+vpatU1KSuLkyZMEBgZmGMDt5OxsMw6jSxeMn37CMAyuXLlC0fLlMdnYeUabNhirVlnem8qUwXT+fIZ2aampNteXmaeffprLly+zZMkSWrVqRa1atfj0009ZunQpjz32GKl/9zd48GCcnZ358MMPLcuuX7+edu3aceXKlUwHrm/dupVmzZpx+fJlDMNg27ZtPPjgg3z33Xd0794duLGdS5UqxYoVK2jRooVl2cGDB5OYmMhXX31F9+7dKVWqFJ999lmGdRw/fpyqVauybds2GjRoYDPPm9udPXvWcrSwatWqNGzYkO7duzNhwgSio6OpVq0ax48fp1y5cpblO3bsSJMmTZg6dSrh4eGMHDmSixcvAtCyZUsaNWrE1KlT8fHxwWQy0bp1axISEti+fbtlO69Zs4ZDhw7h/PdnolevXjg5OfH1118DUKVKFWrWrMmyZcss6+3duzfx8fH8/PPPREZG0q1bN44cOUJAQAAA+/bto169evzxxx80adKESZMmERYWxsmTJyldunSm2yIpKYnjx48TEBCQ7QsOzGYzkZGRdOjQAVdX12wtU5AU9vyg8Oeo/Ao+R+UYHx9PqVKliIuLy/D7nVvy7UjRtm3bOHfuHA0bNrRMS01NZe3atcydO5fk5GTLj44trq6uhISEcPjwYZtt3N3dcXd3z3TZW3dWamoqJpMJJycnnJyyf2bRZDJhcnKynDrJsi1gykbf9qzfEsPfsc+YMYMHHniA0aNHW/pJ/++uXbvYtWsXERERlmXTTzmdOHGCWrVqsW3bNiZOnMjOnTu5dOmSJa+TJ09SoUIFy8Dtpk2bWvo9evQoiYmJdOrUySqulJQUQkJCcHJy4oUXXuCxxx5jx44ddOzYkdDQUFq2bGkV3+22/c3tunTpwn333ceECRMs+aRvg71795KamkrNmjWtlk9OTqZkyZJW60n/74EDB3juuees+mnatCmrVq2ytDGZTNSpU8fqs1OuXDl2795tFXfLli0zvJ89ezZOTk4cOHCAgIAAKlWqZJlft25dihUrxoEDB2jWrBkmk4lKlSplOWbOyckJk8mU6Wf5dnKyTEFS2PODwp+j8iv4cjvHvNhe+VYUtW/fnt27d1tNe/rpp6lZsyYvv/zybQsiuFHE7N69m65duzoqzH/8fdomU7fEasTG2i58bp1+/PidxZWJ1q1b06lTJ8aOHUv//v2t5iUkJPDss8/y4osvZliuYsWKXL16lU6dOtGpUye++uorSpcuTXR0NJ06dcpwSrHITaf40k9r/fzzz5QvX96qXXpR2qVLF06cOMGyZcuIjIykffv2DBky5I4GTE+fPp0WLVowevToDHk6Ozuzbdu2DJ8lb2/vHK8PMn4xTSZTtgpiexWx8xSqiIjcmXwrinx8fKhbt67VtCJFilCyZEnL9L59+1K+fHnCwsIAmDx5Ms2bN6datWpcvnyZt956ixMnTjBo0CDHB2zPD1SRIhmLn9zo1w7Tp0+nQYMGBAUFWU1v2LAh+/bto1q1apkut3v3bi5cuMD06dMtp3a2bt162/XVrl0bd3d3oqOjadOmjc12pUuXpl+/fvTr14/777+f0aNHM3PmTNzc3AAsp/myq2nTpvTo0YNXXnnFanpISAipqamcO3eO+++/P1t9BQUFsXXrVqv7EGV3vNut/vjjjwzva9WqBUCtWrU4efIkJ0+etDp9dvnyZWrXrp2j9YmIyJ3L14HWtxMdHW11CuLSpUsMHjyY2NhYihcvTqNGjdi4caN+SDJRr149+vTpw7vvvms1/eWXX6Z58+YMHTqUQYMGUaRIEfbt20dkZCRz586lYsWKuLm58d577/Hcc8+xZ88em+O1bubj48OoUaMYMWIEaWlp3HfffcTFxbFhwwZ8fX3p168f48ePp1GjRtSpU4fk5GR++uknS6Hg5+eHp6cnv/76KxUqVMDDw4OiRYtmK9epU6dSp04dXFz++TjXqFGDPn360LdvX95++21CQkL466+/WLlyJcHBwXTr1i1DP//+978ZPHgwderU4YEHHmDRokXs2rWLKlWqZCuOm23YsIE333yT0NBQIiMjWbRoET///DMADz74oGX/zJ49m+vXr/PCCy/Qpk0bGjdubPe6REQkd+T7Jfk3W716tdUg69WrVxMeHm55P2vWLE6cOEFycjKxsbH8/PPPhISE5H2gBcTkyZMznNYJDg5mzZo1HDx4kPvvv5+QkBDGjx9vGYxcunRpwsPDWbRoEbVr12b69OnZPr01ZcoUXn/9dcLCwqhVqxadO3fm559/tlxu7+bmxtixYwkODqZ169Y4OzuzYMEC4MaVf++++y4fffQR5cqVswzgzo4aNWowYMAAkpKSrKbPnz+fvn378tJLLxEUFERoaChbtmyhYsWKmfbTp08fXnnlFV5//XUaN27MsWPH6N+/f47umv7SSy+xdetWQkJCeOONN3jnnXcs461MJhPff/89xYsXp3Xr1jz44INUqVKFb775xu71iIhI7sm3q8/yS3x8PEWLFs109HpSUhLHjh2z3BfGXmlpacTHx+Pr62v3QOmCoLDnBxlz7NChA/7+/nz55Zf5HVoGOfm8ms1mli1bRteuXQvlIM/Cnh8U/hyVX8HnqByz+v3OLXf16TORvJSYmMi8efNo2bIlRYsW5ZtvvuG33367J+4nIiIiKopELEwmE7/88gtTp04lOTmZoKAgvv3222zfbV1ERAo2FUUif/P09GTFihWF/hShiIhkTv/qi4iIiKCiKFP32NhzKaD0ORURyV0qim6SPko+Lx46J3Kn0j+nhfUKFhGRvKYxRTdxdnamWLFinDt3DgAvLy/Lc76yIy0tjZSUFJKSkgrleJTCnh8UjBwNwyAxMZFz585RrFixbD0SR0REbk9F0S38/f0BLIWRPQzD4Nq1a3h6etpVTBUUhT0/KFg5FitWzPJ5FRGRO6ei6BYmk4myZcvi5+eH2Wy2a1mz2czatWtp3bp1oTylUdjzg4KTo6urq44QiYjkMhVFNjg7O9v9o+Ps7Mz169fx8PC4q39Qc6qw5wf3Ro4iIpK5u3PQhIiIiEgeU1EkIiIigooiEREREUBFkYiIiAigokhEREQEUFEkIiIiAqgoEhEREQFUFImIiIgAKopEREREABVFIiIiIoCKIhERERFARZGIiIgIoKJIREREBFBRJCIiIgKoKBIREREBVBSJiIiIACqKRERERAAVRSIiIiKAiiIRERERQEWRiIiICHAXFUXTp0/HZDIxfPjwLNstWrSImjVr4uHhQb169Vi2bFneBCgiIiKF2l1RFG3ZsoWPPvqI4ODgLNtt3LiR3r17M3DgQHbs2EFoaCihoaHs2bMnjyIVERGRwirfi6KEhAT69OnDJ598QvHixbNsO2fOHDp37szo0aOpVasWU6ZMoWHDhsydOzePohUREZHCyiW/AxgyZAjdunXjwQcf5I033siy7aZNmxg5cqTVtE6dOrF06VKbyyQnJ5OcnGx5Hx8fD4DZbMZsNuc88Eyk95fb/d4tCnt+UPhzVH4FX2HPUfkVfI7KMS+2Wb4WRQsWLGD79u1s2bIlW+1jY2MpU6aM1bQyZcoQGxtrc5mwsDAmTZqUYfqKFSvw8vKyL+BsioyMdEi/d4vCnh8U/hyVX8FX2HNUfgVfbueYmJiYq/1lJt+KopMnTzJs2DAiIyPx8PBw2HrGjh1rdXQpPj6egIAAOnbsiK+vb66uy2w2ExkZSYcOHXB1dc3Vvu8GhT0/KPw5Kr+Cr7DnqPwKPkflmH6mx5HyrSjatm0b586do2HDhpZpqamprF27lrlz55KcnIyzs7PVMv7+/pw9e9Zq2tmzZ/H397e5Hnd3d9zd3TNMd3V1ddgH0pF93w0Ke35Q+HNUfgVfYc9R+RV8uZ1jXmyvfBto3b59e3bv3k1UVJTl1bhxY/r06UNUVFSGggigRYsWrFy50mpaZGQkLVq0yKuwRUREpJDKtyNFPj4+1K1b12pakSJFKFmypGV63759KV++PGFhYQAMGzaMNm3a8Pbbb9OtWzcWLFjA1q1b+fjjj/M8fhERESlc8v2S/KxER0cTExNjed+yZUsiIiL4+OOPqV+/PosXL2bp0qUZiisRERERe+X7Jfk3W716dZbvAXr27EnPnj3zJiARERG5Z9zVR4pERERE8oqKIhERERFUFImIiIgAKopEREREABVFIiIiIoCKIhERERFARZGIiIgIoKJIREREBFBRJCIiIgKoKBIREREBVBSJiIiIACqKRERERAAVRSIiIiKAiiIRERERQEWRiIiICKCiSERERARQUSQiIiICqCgSERERAVQUiYiIiAAqikREREQAFUUiIiIigIoiEREREUBFkYiIiAigokhEREQEUFEkIiIiAqgoEhEREQFUFImIiIgAKopEREREABVFIiIiIgC42LvAyJEjM51uMpnw8PCgWrVqdO/enRIlStxxcCIiIiJ5xe6iaMeOHWzfvp3U1FSCgoIAOHjwIM7OztSsWZMPPviAl156ifXr11O7du1cD1hERETEEew+fda9e3cefPBBzpw5w7Zt29i2bRunTp2iQ4cO9O7dm9OnT9O6dWtGjBhx277mzZtHcHAwvr6++Pr60qJFC3755Reb7cPDwzGZTFYvDw8Pe1MQERERycDuI0VvvfUWkZGR+Pr6WqYVLVqUiRMn0rFjR4YNG8b48ePp2LHjbfuqUKEC06dPp3r16hiGwRdffEH37t3ZsWMHderUyXQZX19fDhw4YHlvMpnsTUFEREQkA7uLori4OM6dO5fh1Nhff/1FfHw8AMWKFSMlJeW2fT388MNW76dOncq8efP4448/bBZFJpMJf39/e8MWERERyZLdRVH37t0ZMGAAb7/9Nk2aNAFgy5YtjBo1itDQUAD+97//UaNGDbv6TU1NZdGiRVy9epUWLVrYbJeQkEClSpVIS0ujYcOGTJs2zWYBBZCcnExycrLlfXrhZjabMZvNdsV4O+n95Xa/d4vCnh8U/hyVX8FX2HNUfgWfo3LMi21mMgzDsGeBhIQERowYwX/+8x+uX78OgIuLC/369WPWrFkUKVKEqKgoABo0aHDb/nbv3k2LFi1ISkrC29ubiIgIunbtmmnbTZs2cejQIYKDg4mLi2PmzJmsXbuWvXv3UqFChUyXmThxIpMmTcowPSIiAi8vr+wlLSIiIvkqMTGRJ554gri4OKshPLnJ7qIoXUJCAkePHgWgSpUqeHt75yiAlJQUoqOjiYuLY/HixXz66aesWbMmW1eumc1matWqRe/evZkyZUqmbTI7UhQQEMD58+dzfaOazWYiIyPp0KEDrq6uudr33aCw5weFP0flV/AV9hyVX8HnqBzj4+MpVaqUQ4siu0+fpfP29iY4OPiOA3Bzc6NatWoANGrUiC1btjBnzhw++uij2y7r6upKSEgIhw8fttnG3d0dd3f3TJd11AfSkX3fDQp7flD4c1R+BV9hz1H5FXy5nWNebC+7i6KrV68yffp0Vq5cyblz50hLS7Oan370KKfS0tKsjuxkJTU1ld27d9s83SYiIiKSXXYXRYMGDWLNmjU89dRTlC1b9o4uiR87dixdunShYsWKXLlyhYiICFavXs3y5csB6Nu3L+XLlycsLAyAyZMn07x5c6pVq8bly5d56623OHHiBIMGDcpxDCIiIiKQg6Lol19+4eeff6ZVq1Z3vPJz587Rt29fYmJiKFq0KMHBwSxfvpwOHToAEB0djZPTP/eXvHTpEoMHDyY2NpbixYvTqFEjNm7cqDtni4iIyB2zuygqXrx4rj3X7LPPPsty/urVq63ez5o1i1mzZuXKukVERERuZvdjPqZMmcL48eNJTEx0RDwiIiIi+cLuI0Vvv/02R44coUyZMgQGBmYYDb59+/ZcC05EREQkr9hdFKXftVpERESkMLG7KJowYYIj4hARERHJV3aPKRIREREpjLJ1pKhEiRIcPHiQUqVKUbx48SzvTXTx4sVcC05EREQkr2SrKJo1axY+Pj6W/7+TGzaKiIiI3I2yVRT169fP8v/9+/d3VCwiIiIi+cbuMUXOzs6cO3cuw/QLFy7g7OycK0GJiIiI5DW7iyLDMDKdnpycjJub2x0HJCIiIpIfsn1J/rvvvguAyWTi008/xdvb2zIvNTWVtWvXUrNmzdyPUERERCQPZLsoSn/mmGEYfPjhh1anytzc3AgMDOTDDz/M/QhFRERE8kC2i6Jjx44B0K5dO7777juKFy/usKBERERE8prdd7T+/fffHRGHiIiISL6yuygCOHXqFD/88APR0dGkpKRYzXvnnXdyJTARERGRvGR3UbRy5UoeeeQRqlSpwp9//kndunU5fvw4hmHQsGFDR8QoIiIi4nB2X5I/duxYRo0axe7du/Hw8ODbb7/l5MmTtGnThp49ezoiRhERu124cAE/Pz+OHz+ep+tNSUkhMDCQrVu35ul6Re5GBe17aHdRtH//fvr27QuAi4sL165dw9vbm8mTJzNjxgx7uxMRcYipU6fSvXt3AgMDgRv/OHfu3Jly5crh7u5OQEAAQ4cOJT4+3q5+582bR3BwML6+vvj6+tKiRQt++eUXy3w3NzdGjRrFyy+/nJvpiBRIt34P4catfW59LViwwK5+HfU9tLsoKlKkiGUcUdmyZTly5Ihl3vnz5+3tTkQk1yUmJvLZZ58xcOBAyzQnJye6d+/ODz/8wMGDBwkPD+e3337jueees6vvChUqMH36dLZt28bWrVt54IEH6N69O3v37rW06dOnD+vXr7eaJnKvyex7mG7+/PnExMRYXqGhoXb17ajvod1FUfPmzVm/fj0AXbt25aWXXmLq1KkMGDCA5s2b29udiEiu++WXX3B3d7f6N6l48eI8//zzNG7cmEqVKtG+fXteeOEF1q1bZ1ffDz/8MF27dqV69erUqFGDqVOn4u3tzR9//GG1rlatWtn9169IYZLZ9zBdsWLF8Pf3t7w8PDzs6ttR30O7i6J33nmHZs2aATBp0iTat2/PN998Q2BgIJ999pm93YmI5LoNGzbQqFGjLNucOXOG7777jjZt2uR4PampqSxYsICrV6/SokULq3lNmza1u+ASKUyy+h4OGTKEUqVK0bRpUz7//HObjxDLjtz8Htp19VlqaiqnTp0iODgYuHEqTXexFpG7zYkTJyhXrlym83r37s3333/PtWvXePjhh/n000/t7n/37t20aNGCpKQkvL29WbJkCbVr17ZqU65cOU6cOJGj+EUKA1vfw8mTJ/PAAw/g5eXFihUreOGFF0hISODFF1+0q39HfA/tOlLk7OxMx44duXTpkj2LiYjkqaSkJJuH42fNmsX27dv5/vvvOXLkCCNHjrS7/6CgIKKioti8eTPPP/88/fr1Y9++fVZtPD09SUxMzFH8IoWBre/h66+/TqtWrQgJCeHll19mzJgxvPXWW3b374jvod2nz+rWrcvRo0ftXUxEJM+ULFnS5h9v/v7+1KxZk0ceeYSPPvqIefPmERMTY1f/bm5uVKtWjUaNGhEWFkb9+vWZM2eOVZuLFy9SunTpHOcgUtBl9T28WbNmzTh16hTJycl29e+I76HdRdEbb7zBqFGj+Omnn4iJiSE+Pt7qJSKS3xo0aJDhL8bMpKWlAdj9j3Fm/dzax549ewgJCbmjfkUKsux+D6OioihevDju7u53tL7c+B7afUfrrl27AvDII49gMpks0w3DwGQykZqaam+XIiK5qkOHDowbN45Lly5ZHl69bNkyzp49S5MmTfD29mbv3r2MHj2aVq1aWd1D5XbGjh1Lly5dqFixIleuXCEiIoLVq1ezfPlyq3br1q1jypQpuZmWSIGS2ffwxx9/5OzZszRv3hwPDw8iIyOZNm0ao0aNsqtvR30P9UBYESl06tWrR8OGDVm4cCHPPvsscGNswSeffMKIESNITk4mICCAHj168Morr1iWO378OJUrV+b333+nbdu2mfZ97tw5+vbtS0xMDEWLFiU4OJjly5fToUMHS5tNmzYRFxfHv/71L4fmKXI3y+x76Orqyvvvv8+IESMwDINq1arxzjvvMHjwYMty+fk9tLsoupPLV0VE8sr48eMZPXo0gwcPxsnJiXbt2rFx48Yslzl27BjFihWjfv36Nttk59Yjs2fPZvTo0Xh6etodt0hhcuv3sHPnznTu3DnLZfLze2h3USQiUhB069aNQ4cOcfr0aQICArK1zLJly3j11Vcth/pzIiUlhXr16jFixIgc9yFSWBS076GKIhEpmCZOBGdneP11m02GDx9+43+mTIHU1BvLZCEnlwXfys3NjXHjxt1xPyKFheV7mE35+T20++ozEZG7grMzjB9/o+DJypQpN9o5O+dNXCL3ICM1ldMRP7Dh/l6srNwagD9fn0Xi8VP5HJl98rUout1TbjOzaNEiatasiYeHB/Xq1WPZsmV5FK2I3FVefx0mT866MEoviCZPzvKIkojkXNr162x7/N9E9RvN5f/t4nr8VQCiP/qatSEPc+mPqPwN0A53XBSlpKSQkJCQo2Wz85Tbm23cuJHevXszcOBAduzYQWhoKKGhoezZs+dOUhCRgiqrwkgFkUieODYnnLM/rrrx5u97f8GNo0ep15LY2uN50lJS8ik6+9g1pmj+/Pls376d5s2b06dPH8aOHcs777zD9evXeeCBB1iwYAElS5bMdn8PP/yw1fupU6cyb948/vjjD+rUqZOh/Zw5c+jcuTOjR48GYMqUKURGRjJ37lw9g03kXpVe8Iwfj1NqKs61auE0YQKEhcG4cTByJFy98Zcrzs5w82MH0qdnxskJbr5qxZ62iYlg6wGXJhN4eeWs7bVrkJyMc1LSjXhcXa3bFyli3famH6gMbm6blHRjzFVutPXyuhE3QHIyXL9uX1uzOfP8PD1vbGeAlBQwm233a09bD49/Tq3a09ZsvtHeFnd3cHHJ2Daz/G5ue/36jW1hi5vbP8vZ0zY19ca+s8XV9UZ7O9sa169zYvZ8nNP++UwYRhqWd6lppPx1kdglkZTr1c12n3eJbBdFU6dOZerUqbRq1YqIiAjWr1/P0qVLmTx5Mk5OTrz77ruMGzeOefPm5SiQ1NRUFi1alOlTbtNt2rQpw3OKOnXqxNKlS232m5ycbHWHy/S7bpvNZsxZffhzIL2/3O73blHY84PCn2Ohze+VV24URJMm8dDN099448brb2ldupD6/feW9y5+fphsPBcprXVrUn/77Z+2gYGYzp/PvG2jRqRu2vRP29q1Mdl4CKVRqxbXd+78p23jxpj278+8baVKXD90yPLe+f77cd22zTrH9LalSnH9zJl/2nbujNPatZn36+XF9cuX/2nbowdOWQxdMN/04+/cpw9O331nu+2lS5YiynnwYJy+/NJ229On4e9HMDgNH47zhx/iCpnmZz54EP6+yabT2LE4v/OO7X537IC//7B2mjIF55s+A7e6vnEjRuPGN9q+8w7OY8fabhsZifH3bWmc5s3Dedgw222XLsX4+2bHpv/8B5dBgwAyze96RATG3/fSMS1ejMsTT9ju99NPMfr2vdF22TJcQkNttk2dM4e055+/0XbNGlxuuodPhrZhYaS99NKNtlu34tKype2248aRNn48AOY163jg1C23ukiA7wHD48Ydqk2uLlzYspPSPTra7DM78uLfrWwXReHh4Xz22Wf07t2brVu30qxZMxYuXMhjjz0G3Hgm2nPPPWd3ANl5ym262NhYypQpYzWtTJkyxMbG2uw/LCyMSZMmZZi+YsUKvG7+CywXRUZGOqTfu0Vhzw8Kf46FMr+QEB5yccE5iyMT586dY/NN4xC7paba/Efw4oULbLipbeeUFGw9hCAuLo61N7XtkJiIrX9driQk8PtNbdslJOBro+21xEQib2rbOi4OWxcpp6Sk8OtNbVtduEApG21TU1OtxmM2O3cOfxttAau2jWNjKZ9F2+XLl5P699G4kFOnqJhF299++42UokUBCD5xgspZtP3999+59ve//7WPHqV6Fm3XrVvHlb+L0qBDh6iZRdsNGzZw+dw5AKr9+ScZz1H8448//uDC30cMK+/dS3AWbbdu3crZv/8/YOdOGmbRdseOHZz5+/eo3I4dNMmi7a6dOzn59/4os3Ur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qrBmzRrWrFmTabvvvvsu14ITERERySvZLor69u2rx2mIiIhIoZXtoig8PNyBYYiIiIjkL7sGWouIiIgUViqKRERERFBRJCIiIgKoKBIREREBVBSJiIiIACqKRERERAAVRSIiIiKAiiIRERERQEWRiIiICKCiSERERARQUSQiIiICqCgSERERAVQUiYiIiAAqikREREQAFUUiIiIigIoiEREREUBFkYiIiAigokhEREQEUFEkIiIiAqgoEhEREQFUFImIiIgAKopEREREABVFIiIiIoCKIhERERFARZGIiIgIoKJIREREBFBRJCIiIgKoKBIREREB8rkoCgsLo0mTJvj4+ODn50doaCgHDhy47XKLFi2iZs2aeHh4UK9ePZYtW5YH0YqIiEhhlq9F0Zo1axgyZAh//PEHkZGRmM1mOnbsyNWrV20us3HjRnr37s3AgQPZsWMHoaGhhIaGsmfPnjyMXERERAobl/xc+a+//mr1Pjw8HD8/P7Zt20br1q0zXWbOnDl07tyZ0aNHAzBlyhQiIyOZO3cuH374ocNjFhERkcIpX4uiW8XFxQFQokQJm202bdrEyJEjraZ16tSJpUuXZto+OTmZ5ORky/v4+HgAzGYzZrP5DiO2lt5fbvd7tyjs+UHhz1H5FXyFPUflV/A5Kse82GYmwzAMh68lG9LS0njkkUe4fPky69evt9nOzc2NL774gt69e1umffDBB0yaNImzZ89maD9x4kQmTZqUYXpERAReXl65E7yIiIg4VGJiIk888QRxcXH4+vo6ZB13zZGiIUOGsGfPniwLopwYO3as1ZGl+Ph4AgIC6NixY65vVLPZTGRkJB06dMDV1TVX+74bFPb8oPDnqPwKvsKeo/Ir+ByVY/qZHke6K4qioUOH8tNPP7F27VoqVKiQZVt/f/8MR4TOnj2Lv79/pu3d3d1xd3fPMN3V1dVhH0hH9n03KOz5QeHPUfkVfIU9R+VX8OV2jnmxvfL16jPDMBg6dChLlixh1apVVK5c+bbLtGjRgpUrV1pNi4yMpEWLFo4KU0RERO4B+XqkaMiQIURERPD999/j4+NDbGwsAEWLFsXT0xOAvn37Ur58ecLCwgAYNmwYbdq04e2336Zbt24sWLCArVu38vHHH+dbHiIiIlLw5euRonnz5hEXF0fbtm0pW7as5fXNN99Y2kRHRxMTE2N537JlSyIiIvj444+pX78+ixcvZunSpdStWzc/UhAREZFCIl+PFGXnwrfVq1dnmNazZ0969uzpgIhERETkXqVnn4mIiIigokhEREQEUFEkIiIiAqgoEhEREQFUFImIiIgAKopEREREABVFIiIiIoCKIhERERFARZGIiIgIoKJIREREBFBRJCIiIgKoKBIREREBVBSJiIiIACqKRERERAAVRSIiIiKAiiIRERERQEWRiIiICKCiSERERARQUSQiIiICqCgSERERAVQUiYiIiAAqikREREQAFUUiIiIigIoiEREREUBFkYiIiAigokhEREQEUFEkIiIiAqgoEhEREQFUFImIiIgAKopEREREABVFIiIiIkA+F0Vr167l4Ycfply5cphMJpYuXZpl+9WrV2MymTK8YmNj8yZgERERKbTytSi6evUq9evX5/3337druQMHDhATE2N5+fn5OShCERERuVe45OfKu3TpQpcuXexezs/Pj2LFiuV+QCIiInLPyteiKKcaNGhAcnIydevWZeLEibRq1cpm2+TkZJKTky3v4+PjATCbzZjN5lyNK72/3O73blHY84PCn6PyK/gKe47Kr+BzVI55sc1MhmEYDl9LNphMJpYsWUJoaKjNNgcOHGD16tU0btyY5ORkPv30U7788ks2b95Mw4YNM11m4sSJTJo0KcP0iIgIvLy8cit8ERERcaDExESeeOIJ4uLi8PX1dcg6ClRRlJk2bdpQsWJFvvzyy0znZ3akKCAggPPnz+f6RjWbzURGRtKhQwdcXV1zte+7QWHPDwp/jsqv4CvsOSq/gs9ROcbHx1OqVCmHFkUF8vTZzZo2bcr69ettznd3d8fd3T3DdFdXV4d9IB3Z992gsOcHhT9H5VfwFfYclV/Bl9s55sX2KvD3KYqKiqJs2bL5HYaIiIgUcPl6pCghIYHDhw9b3h87doyoqChKlChBxYoVGTt2LKdPn+Y///kPALNnz6Zy5crUqVOHpKQkPv30U1atWsWKFSvyKwUREREpJPK1KNq6dSvt2rWzvB85ciQA/fr1Izw8nJiYGKKjoy3zU1JSeOmllzh9+jReXl4EBwfz22+/WfUhIiIikhP5WhS1bduWrMZ5h4eHW70fM2YMY8aMcXBUIiIici8q8GOKRERERHKDiiIRERERVBSJiIiIACqKRERERAAVRSIiIiKAiiIRERERQEWRiIiICKCiSERERARQUSQiIiICqCgSERERAVQUiYiIiAAqikREREQAFUUiIiIigIoiEREREUBFkYiIiAigokhEREQEUFHkMBcuXMDPz4/jx4/n+br/7//+j7fffjvP11vY5Oc+bN68Od9++22er1dE5F6moshBpk6dSvfu3QkMDLRMe/HFF2nUqBHu7u40aNAgR/3u3buXxx57jMDAQEwmE7Nnz87QZty4cUydOpW4uLicBS9Axn24c+dOevfuTUBAAJ6entSqVYs5c+bY3e/atWt5+OGHKVeuHCaTiaVLl2ZoM27cOF555RXS0tLuMAsREckuFUUOkJiYyGeffcbAgQMzzBswYAC9evW6o76rVKnC9OnT8ff3z7RN3bp1qVq1Kv/9739zvJ57XWb7cNu2bfj5+fHf//6XvXv38tprrzF27Fjmzp1rV99Xr16lfv36vP/++zbbdOnShStXrvDLL7/kOAcREbGPS34HUBj98ssvuLu707x5c6vp7777LgB//fUXu3btylHfTZo0oUmTJgC88sorNts9/PDDLFiwgCFDhuRoPfe6zPbhgAEDrNpUqVKFTZs28d133zF06NBs992lSxe6dOmSZRtnZ2e6du3KggUL6Natm33Bi4hIjuhIkQNs2LCBRo0a5WsMTZs25X//+x/Jycn5GkdBld19GBcXR4kSJRwSQ9OmTVm3bp1D+hYRkYxUFDnAiRMnKFeuXL7GUK5cOVJSUoiNjc3XOAqq7OzDjRs38s033/DMM884JIZy5cpx8uRJjSsSEckjKoocICkpCQ8Pj3yNwdPTE7gxNkbsd7t9uGfPHrp3786ECRPo2LGjQ2Lw9PQkLS1NR/tERPKIiiIHKFmyJJcuXcrXGC5evAhA6dKl8zWOgiqrfbhv3z7at2/PM888w7hx4xwWw8WLFylSpIilwBUREcdSUeQADRo0YN++ffkaw549e6hQoQKlSpXK1zgKKlv7cO/evbRr145+/foxdepUh8awZ88eQkJCHLoOERH5h4oiB+jQoQN79+7NcKTh8OHDREVFERsby7Vr14iKiiIqKoqUlJRs952SkmK13OnTp4mKiuLw4cNW7datW+ew0zr3gsz24Z49e2jXrh0dO3Zk5MiRxMbGEhsby19//WVX3wkJCZZ9CHDs2DGioqKIjo62aqd9KCKSt1QUOUC9evVo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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "# 原始数据\n",
    "X = np.array([[1, 1], [5, 5], [5, 3], [2, 1]])\n",
    "y = np.array([0, 1, 1, 0])  # 用户偏好类别\n",
    "\n",
    "# 新数据点\n",
    "new_user = np.array([[3, 3]])\n",
    "\n",
    "# 绘制原始样本点，用不同的颜色标记不同的类别\n",
    "plt.scatter(X[:, 0], X[:, 1], c=y, cmap='coolwarm', label='Original data')\n",
    "\n",
    "# 绘制新数据点，用红色x标记\n",
    "plt.plot(new_user[0][0], new_user[0][1], 'rx', markersize=8, label='New data')\n",
    "\n",
    "# 使用KNN找到最近邻\n",
    "knn = NearestNeighbors(n_neighbors=1)\n",
    "knn.fit(X)\n",
    "dist, idx = knn.kneighbors(new_user)\n",
    "\n",
    "# 获取最近邻点的坐标\n",
    "nearest = X[idx[0][0]]\n",
    "\n",
    "# 用红线标记新数据点与最近邻点的连接线\n",
    "plt.plot([new_user[0][0], nearest[0]], [new_user[0][1], nearest[1]], 'r--', label='Nearest Neighbor')\n",
    "\n",
    "# 设置图表标题和坐标轴标签\n",
    "plt.title(\"User Movie Preference\", size=15)\n",
    "plt.xlabel(\"Movie A rating\")\n",
    "plt.ylabel(\"Movie B rating\")\n",
    "plt.grid()\n",
    "plt.legend()\n",
    "\n",
    "# 为每个点添加坐标文本\n",
    "for i, (x, y) in enumerate(zip(X[:, 0], X[:, 1])):\n",
    "    plt.text(x, y+0.1, f'({x}, {y})')\n",
    "\n",
    "# 为新数据点添加坐标文本\n",
    "plt.text(new_user[0][0], new_user[0][1]+0.1, f'({new_user[0][0]}, {new_user[0][1]})')\n",
    "\n",
    "# 显示图表\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.11"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
